package Componentes;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

import Graficos.ComponenteGrafico;
import Juegos.Posicion;

/**
 * ProyectoX TDP 2011
 * @author  Ma Gimena Ramos- LU:82716
 * @autor Brenda Dilschneider- LU: 92774
 *
 */
public class Goomba extends Enemigo implements Runnable {

	int controlPos;
	Thread hilo;
	
	/**
	 * constructor
	 */
	public Goomba(){
		super();
		puntaje = 60;
		controlPos=0;
		hilo= new Thread(this);
		visible = true;
		sentido=1;
		transitable=false;
		pm=true;
		destruido=false;
		
	}
	
	/**
	 * metodo que devuelve un clon de tipo Goomba
	 */
	public Object clonar()
	{
		Goomba v = new Goomba();

	ComponenteGrafico c=  new ComponenteGrafico(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/goomba.gif")));
		
		v.setGrafico(c);
		setPersonaje(mario);
		return v;
	}
	
	/**
	 * al chocar mario se encarga de matarlo,hacerlo chiquito o
	 *  si es invensible el mario morir el
	 */
	@Override
	public void chocarMario(){
	Posicion posJugador= mario.obtenerPartida().obtenerPosicionActual();
	if (posJugador.getX()==posJugador.getX()){
		
			if (mario.invencible()){
				if (!destruido){
					 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/goomba.gif")));
						mario.obtenerPartida().aumentarPuntaje(60);
					
			 try {
						hilo.sleep(100);
					} catch (InterruptedException e) {
					
						e.printStackTrace();
					}
			 
				destruirHilo();
					
			}}	
			else
			{	mario.obtenerPartida().disminuirPuntaje(30);
			if (mario.estachiquito())
			{
				mario.goQuieto();
		        mario.morir();
		    mario.obtenerPartida().disminuirVidas();
         JOptionPane dialogo= new JOptionPane();
		 	if (mario.obtenerPartida().getVidas()==0){
				 dialogo.showMessageDialog (null, "Juego terminado.", "Gracias por jugar", JOptionPane.WARNING_MESSAGE);
				mario.CambiaMario();
		
		 	}
				else {
					dialogo.showMessageDialog (null, "Ha perdido una vida", "Aceptar", JOptionPane.WARNING_MESSAGE);
					mario.goQuieto();
					mario.goDerecha();
			}
		 	}
			else{
				mario.MarioPequeño();
				mario.obtenerPartida().aumentarPosicionActual(1, 1); 
				mario.setBounds(16*mario.obtenerPartida().obtenerPosicionActual().getX(),16*mario.obtenerPartida().obtenerPosicionActual().getY()+16, 16, 16);
				mario.setLocation (16*mario.obtenerPartida().obtenerPosicionActual().getX(),16*mario.obtenerPartida().obtenerPosicionActual().getY());
			
			 
			   
			}
			}
		}	
	}
	
	 
	
	
	/**
	 * inicia el hilo del goomba
	 */
	@Override
	public void arrancarHilo() {
				hilo.start();
			}
	
	/**
	 * al goomba inicia su movimiento controlando si choca con mario 
	 */
	@Override
	public void run() {
		{ 
			while( true ) {
			mario.repaint();
				if (sentido==1){//va hacia la izquierda
				this.comp.setLocation(this.comp.getLocation().x-1, this.comp.getLocation().y);
				controlPos+=1;
		if (controlPos==16)
			{controlPos=0;
		     this.setPosicion(this.obtenerPosicion().getX()-1,this.obtenerPosicion().getY());
		     if (this.obtenerPosicion().getX()== mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()== mario.obtenerPartida().obtenerPosicionActual().getY()+1){  
		    	 
		    	 chocarMario();}
		    
			Componente c1= mario.obtenerPartida().getComponente(this.obtenerPosicion().getX()-1,this.obtenerPosicion().getY())	;
			if (c1!=null)
				c1.serChocado(this);
			if (this.obtenerPosicion().getX()==mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()==mario.obtenerPartida().obtenerPosicionActual().getY()){
				chocarMario(); }
		     try {
				hilo.sleep(400);				
			
			} catch (InterruptedException e) {
							e.printStackTrace();
			}
			}
			gravedad.Caida(this);
			}else{ //va hacia la derecha
				
				this.comp.setLocation(this.comp.getLocation().x+1, this.comp.getLocation().y);
				controlPos+=1;
		if (controlPos==16)
			{controlPos=0;
		     this.setPosicion(this.obtenerPosicion().getX()+1,this.obtenerPosicion().getY());
		     if (this.obtenerPosicion().getX()== mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()== mario.obtenerPartida().obtenerPosicionActual().getY()+1)
		    	 chocarMario();
		    
			Componente c1= mario.obtenerPartida().getComponente(this.obtenerPosicion().getX()+1,this.obtenerPosicion().getY())	;
			if (c1!=null)
				c1.serChocado(this);
				if (this.obtenerPosicion().getX()==mario.obtenerPartida().obtenerPosicionActual().getX() && this.obtenerPosicion().getY()==mario.obtenerPartida().obtenerPosicionActual().getY()){
				chocarMario();
			}
		     try {
				hilo.sleep(400);				
			
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
			gravedad.Caida(this);
			
			}
				
				if (this.obtenerPosicion().getX()==0)
									destruirHilo();
				}
	}
	}
	
	/**
	 * para  el hilo y asigna valores a algunas variables propias
	 */
	public void destruirHilo()
	{

		destruido=true;
		
		this.comp.setIcon(null);
		
		hilo.stop();
	}
	
	/**
	 * si es pisado por mario muere
	 */
	@Override
	public void pisadoPorMario() {
							
		if (!destruido()){
			
			mario.obtenerPartida().aumentarPuntaje(60);
						 this.comp.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Dibujos/goombaM.png")));
			
			 mario.setLocation(mario.getLocation().x+16, mario.getLocation().y+16);
						 mario.obtenerPartida().aumentarPosicionActual(1, 1);
				try {
					hilo.sleep(100);
				} catch (InterruptedException e) {
			
					e.printStackTrace();
				}
			destruirHilo();
			
	}}

	/**
	 * cambia el sentido en el cual se movia
	 */
	@Override
	public void serChocado() {
	if (sentido==1)	
	sentido=2;
	else
		sentido=1;


	}

	/**
	 *si el componente pasado por parametro son tiros se destruye el hilo del mismo 
	 *y al objeto actual se le aplica el pisarMario()
	 */
	@Override
	public void serChocado(Componente c) {
		if (!destruido()){
		if (!c.obtenerPM()){	
		if (c.esVisible())
			{this.pisadoPorMario();
			
			 c.destruirHilo();
		
	}}}
		}


}
